#!/bin/bash

# =============================================================================
# Admin服务状态检查脚本
# 作者: AI Assistant
# 创建时间: $(date +%Y-%m-%d)
# =============================================================================

# 配置参数
JAR_FOLDER="/mydata/jars/yccloud17/admin"
JAR_NAME="admin-0.0.1-SNAPSHOT.jar"
PID_FILE="$JAR_FOLDER/admin.pid"
LOG_FILE="$JAR_FOLDER/admin.log"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 打印分隔线
print_separator() {
    echo -e "${CYAN}========================================${NC}"
}

# 检查Java环境
check_java() {
    echo -e "${CYAN}Java环境检查:${NC}"
    if command -v java &> /dev/null; then
        JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
        echo -e "  ${GREEN}✓${NC} Java版本: $JAVA_VERSION"
        
        # 检查Java路径
        JAVA_PATH=$(which java)
        echo -e "  ${GREEN}✓${NC} Java路径: $JAVA_PATH"
    else
        echo -e "  ${RED}✗${NC} Java未安装或不在PATH中"
        return 1
    fi
    echo
}

# 检查JAR文件
check_jar() {
    echo -e "${CYAN}JAR文件检查:${NC}"
    JAR_PATH="$JAR_FOLDER/$JAR_NAME"
    
    if [ -f "$JAR_PATH" ]; then
        echo -e "  ${GREEN}✓${NC} JAR文件存在: $JAR_PATH"
        
        # 文件大小
        JAR_SIZE=$(du -h "$JAR_PATH" | cut -f1)
        echo -e "  ${GREEN}✓${NC} 文件大小: $JAR_SIZE"
        
        # 文件权限
        if [ -r "$JAR_PATH" ]; then
            echo -e "  ${GREEN}✓${NC} 文件权限: 可读"
        else
            echo -e "  ${RED}✗${NC} 文件权限: 不可读"
            return 1
        fi
        
        # 文件修改时间
        JAR_MTIME=$(stat -c %y "$JAR_PATH" | cut -d'.' -f1)
        echo -e "  ${GREEN}✓${NC} 修改时间: $JAR_MTIME"
    else
        echo -e "  ${RED}✗${NC} JAR文件不存在: $JAR_PATH"
        return 1
    fi
    echo
}

# 检查配置文件
check_config() {
    echo -e "${CYAN}配置文件检查:${NC}"
    APPLICATION_YML="$JAR_FOLDER/application.yml"
    
    if [ -f "$APPLICATION_YML" ]; then
        echo -e "  ${GREEN}✓${NC} 配置文件存在: $APPLICATION_YML"
        
        # 文件大小
        CONFIG_SIZE=$(du -h "$APPLICATION_YML" | cut -f1)
        echo -e "  ${GREEN}✓${NC} 文件大小: $CONFIG_SIZE"
        
        # 文件修改时间
        CONFIG_MTIME=$(stat -c %y "$APPLICATION_YML" | cut -d'.' -f1)
        echo -e "  ${GREEN}✓${NC} 修改时间: $CONFIG_MTIME"
    else
        echo -e "  ${YELLOW}⚠${NC} 配置文件不存在: $APPLICATION_YML"
    fi
    echo
}

# 检查服务进程
check_process() {
    echo -e "${CYAN}服务进程检查:${NC}"
    
    # 通过PID文件检查
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        echo -e "  ${GREEN}✓${NC} PID文件存在: $PID_FILE"
        echo -e "  ${GREEN}✓${NC} 记录PID: $PID"
        
        if ps -p "$PID" > /dev/null 2>&1; then
            echo -e "  ${GREEN}✓${NC} 进程状态: 运行中"
            
            # 进程详细信息
            PROCESS_INFO=$(ps -p "$PID" -o pid,ppid,user,comm,etime,pcpu,pmem --no-headers)
            echo -e "  ${GREEN}✓${NC} 进程信息: $PROCESS_INFO"
            
            # 内存使用
            MEMORY_USAGE=$(ps -p "$PID" -o rss --no-headers | tr -d ' ')
            if [ -n "$MEMORY_USAGE" ]; then
                MEMORY_MB=$((MEMORY_USAGE / 1024))
                echo -e "  ${GREEN}✓${NC} 内存使用: ${MEMORY_MB}MB"
            fi
            
            return 0
        else
            echo -e "  ${RED}✗${NC} 进程状态: 进程已死亡"
            return 1
        fi
    else
        echo -e "  ${YELLOW}⚠${NC} PID文件不存在: $PID_FILE"
    fi
    
    # 通过进程名检查
    PIDS=$(pgrep -f "$JAR_NAME")
    if [ -n "$PIDS" ]; then
        echo -e "  ${GREEN}✓${NC} 发现同名进程: $PIDS"
        
        # 检查每个进程
        for pid in $PIDS; do
            if ps -p "$pid" > /dev/null 2>&1; then
                PROCESS_INFO=$(ps -p "$pid" -o pid,ppid,user,comm,etime,pcpu,pmem --no-headers)
                echo -e "  ${GREEN}✓${NC} 进程 $pid: $PROCESS_INFO"
            fi
        done
        
        return 0
    else
        echo -e "  ${RED}✗${NC} 未发现运行中的服务进程"
        return 1
    fi
    echo
}

# 检查日志文件
check_logs() {
    echo -e "${CYAN}日志文件检查:${NC}"
    
    if [ -f "$LOG_FILE" ]; then
        echo -e "  ${GREEN}✓${NC} 日志文件存在: $LOG_FILE"
        
        # 文件大小
        LOG_SIZE=$(du -h "$LOG_FILE" | cut -f1)
        echo -e "  ${GREEN}✓${NC} 文件大小: $LOG_SIZE"
        
        # 文件修改时间
        LOG_MTIME=$(stat -c %y "$LOG_FILE" | cut -d'.' -f1)
        echo -e "  ${GREEN}✓${NC} 修改时间: $LOG_MTIME"
        
        # 最后几行日志
        echo -e "  ${GREEN}✓${NC} 最新日志内容:"
        tail -5 "$LOG_FILE" | while IFS= read -r line; do
            echo -e "    $line"
        done
    else
        echo -e "  ${YELLOW}⚠${NC} 日志文件不存在: $LOG_FILE"
    fi
    echo
}

# 检查端口占用
check_ports() {
    echo -e "${CYAN}端口占用检查:${NC}"
    
    # 检查常用端口
    PORTS=(8080 8081 8082 8083 8084 8085)
    
    for port in "${PORTS[@]}"; do
        if netstat -tlnp 2>/dev/null | grep ":$port " > /dev/null; then
            PROCESS_INFO=$(netstat -tlnp 2>/dev/null | grep ":$port " | awk '{print $7}')
            echo -e "  ${GREEN}✓${NC} 端口 $port: 被占用 ($PROCESS_INFO)"
        else
            echo -e "  ${YELLOW}-${NC} 端口 $port: 未被占用"
        fi
    done
    echo
}

# 检查系统资源
check_system() {
    echo -e "${CYAN}系统资源检查:${NC}"
    
    # CPU使用率
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    echo -e "  ${GREEN}✓${NC} CPU使用率: ${CPU_USAGE}%"
    
    # 内存使用
    MEMORY_INFO=$(free -h | grep "Mem:")
    TOTAL_MEM=$(echo "$MEMORY_INFO" | awk '{print $2}')
    USED_MEM=$(echo "$MEMORY_INFO" | awk '{print $3}')
    FREE_MEM=$(echo "$MEMORY_INFO" | awk '{print $4}')
    echo -e "  ${GREEN}✓${NC} 内存使用: $USED_MEM/$TOTAL_MEM (可用: $FREE_MEM)"
    
    # 磁盘使用
    DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}')
    echo -e "  ${GREEN}✓${NC} 根目录磁盘使用: $DISK_USAGE"
    
    echo
}

# 生成状态报告
generate_report() {
    print_separator
    echo -e "${CYAN}Admin服务状态报告${NC}"
    echo -e "${CYAN}生成时间: $(date '+%Y-%m-%d %H:%M:%S')${NC}"
    print_separator
    
    # 检查各项
    check_java
    check_jar
    check_config
    check_process
    check_logs
    check_ports
    check_system
    
    # 总结
    print_separator
    echo -e "${CYAN}状态总结:${NC}"
    
    if check_process > /dev/null 2>&1; then
        echo -e "  ${GREEN}✓${NC} Admin服务运行正常"
        exit 0
    else
        echo -e "  ${RED}✗${NC} Admin服务未运行或异常"
        exit 1
    fi
}

# 主函数
main() {
    case "${1:-report}" in
        "report"|"status")
            generate_report
            ;;
        "process")
            check_process
            ;;
        "logs")
            check_logs
            ;;
        "ports")
            check_ports
            ;;
        "system")
            check_system
            ;;
        "help"|"-h"|"--help")
            echo "用法: $0 [选项]"
            echo "选项:"
            echo "  report, status  - 生成完整状态报告 (默认)"
            echo "  process         - 仅检查服务进程"
            echo "  logs            - 仅检查日志文件"
            echo "  ports           - 仅检查端口占用"
            echo "  system          - 仅检查系统资源"
            echo "  help, -h        - 显示此帮助信息"
            ;;
        *)
            echo "未知选项: $1"
            echo "使用 '$0 help' 查看帮助信息"
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"


